package com.ruoyi.system.service;

import com.ruoyi.common.prop.UserProperties;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.SysOss;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 最爱喝兽奶
 * @create 2022/6/13
 **/
public interface ISysOssService {

    String separator = "/";

    /**
     * 存储文件地址和分片数的映射关系
     */
    Map<String, Integer> chunksMap = new HashMap<>(25);

    /**
     * 根据传入的id数组，查询出对应的文件列表
     *
     * @param ids
     * @return
     */
    List<SysOss> queryListByIds(List<String> ids);

    /**
     * 根据传入id来查询出文件信息
     *
     * @param id
     * @return
     */
    SysOss queryById(String id);

    /**
     * 上传文件
     *
     * @param file
     */
    SysOss upload(MultipartFile file);

    SysOss upload(InputStream is, String fileName, String suffix);

    /**
     * 上传文件，通过字节数组的形式
     * @param flush
     * @param fileName
     * @param suffix
     * @return
     */
    SysOss upload(byte[] flush, String fileName, String suffix);

    byte[] download(String ossId);

    Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);


    /**
     * 传入当前分片数和当前文件名称，生成临时文件的名称
     *
     * @param name  当前文件名称
     * @param chunk 当前分片数
     * @return
     */
    default String createTempFileName(String name, Integer chunk){
        if (null == chunk) {
            return name;
        }
        return chunk + "_" + name;
    }

    /**
     * 创建临时文件
     * @param name 文件名
     * @param chunk 文件当前的分片数
     * @param chunks 文件的总分片数
     * @param fileBasePath 文件的基本路径
     * @return 返回临时文件
     */
    default File createTempFile(String name, Integer chunk, Integer chunks, String fileBasePath) {
        String tempFileName = createTempFileName(name, chunk);
        if (!chunksMap.containsKey(name)) {
            chunksMap.put(name, chunks);
        }
        if (!fileBasePath.endsWith(separator)) {
            fileBasePath = fileBasePath + separator;
        }
        if (!FileUtils.exist(fileBasePath)) {
            FileUtils.mkdir(fileBasePath);
        }
        return new File(fileBasePath + tempFileName);
    }

    /**
     * 获取当前文件的总分片数
     * @param name 文件名
     * @return 总的分片数
     */
    default Integer getChunks(String name) {
        return chunksMap.get(name);
    }

    /**
     * 通过传入存储对象的id，返回输入流
     * @param ossId
     * @return
     */
    InputStream getInputStreamByOssId(Serializable ossId);
}